Windows系统下采用命令行编译C++ MPI程序
一. 目的
目标程序比较大,之前主要是在Liunx下进行程序的开发、编译与使用,现在想在Windows下进行开发、编译与使用。为了实现跨平台,程序的编译过程不宜采用Visual Studio IDE建立的Solution进行编译,否则更换编译器时,VS的Soultion就用不了了。
理想的方式是自己编写程序编译的脚本文件,采用命令行编译的方式,程序使用的开发语言是C++,并采用MPI进行并行化。为此,本文记录如何在Windows系统下采用命令行编译C++ MPI程序。
二. C++ 编译过程
一般而言,对于 C++ 程序编译有以下4个阶段:
预处理(preprocessing)
对源程序中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令包括宏定义、条件编译指令、头文件包含指令等。
编译(compilation)
将预处理后的文件编译生成后缀为.s的汇编语言文件,。编译程序所要做的工作是通过记法分析和语法分析,在确认所有指令都符合语法规则后,将其翻译成等价的中间代码或汇编代码。
汇编(assembly)
将汇编文件汇编生成后缀为.o的目标文件(二进制)。汇编过程实际上是指把汇编语言代码翻译成目标机器指令的过程。
链接(linking)
将多个目标文件和库连接生成后缀为.out或.exe的可执行文件。链接程序的主要工作就是将有关的目标文件彼此相连接,即将在一个文件中引用的符号现该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
链接处理
静态链接(static linking):指链接器在链接时将库(静态库)的内容拷贝到可执行程序中。
动态链接(dynamic linking):指程序运行时才将库(动态链接库)连接到程序中。
三. 环境
- Windows 10 操作系统
- 安装Visual Studio Professional 2017
- 安装MSMPI,安装路径为:
D:\Program Files (x86)
,具体的安装教程可参考Win10下Microsoft MPI(MSMPI)的下载安装这篇文章. - 将要编译程序的版本为:x64
四. 编译方法
- 方法一:Visual Studio Professional 2017 IDE环境下的编译,详见VS2017配置MPI文章介绍
- 方法二:命令行编译C++ MPI程序。参考:How to compile and run C/C++ MPI codes in cmd on windows without Visual Studio
具体步骤为:
建立一个简单的mpi c++代码,如:MpiHelloWorld.cpp,并保存,例如:E:\Desktop\MPI_Test\MpiHelloWorld.cpp,接下来就采用命令行对此源代码进行编译
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, char *argv[]) {
int myid, numprocs;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
printf("%d Hello world from process %d \n", numprocs, myid);
MPI_Finalize();
return 0;
}打开开始菜单中的
x64 Native Tools Command Prompt for VS 2017
工具,用vs自带的命令行工具,可以方便地调用cl.exe和link.exe,如果不想用vs自带的命令行工具,也可以使用windows原始的cmd命令行工具,不过这种情况下需要自己手动定义好vs的引用目录和库文件目录的环境变量。此处采用的是vs提供的命令行工具。切换至MpiHelloWorld.cpp文件所在目录
首先编译,在该目录下执行以下命令:1
cl -I"D:\Program Files (x86)\Microsoft SDKs\MPI\Include" -I"D:\Program Files (x86)\Microsoft SDKs\MPI\Include\x64" -c MPIHelloWorld.cpp
其中,cl为cl.exe编译器,-I(大写的i)表示指定第一个寻找头文件的目录(如果指定多个目录,则使用多个-I),在本例中要将MPI的两个Include目录包含进去。-c表示只编译不链接。编译完之后可以看到当前目录下生成了MPIHelloWorld.obj汇编文件
然后链接,在该目录下执行以下命令:1
link -machine:x64 -out:MpiHelloWorld.exe -dynamicbase "msmpi.lib" -libpath:"D:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" MPIHelloWorld.obj
其中,link为link.exe链接器,-machine:x64表示x64版本,-out表示指定输出文件名,-dynamicbase表示包含附加依赖项msmpi.lib,而-libpath表示设置库目录,最后MPIHelloWorld.obj表示要链接的汇编文件。链接完之后可以看到当前目录下生成了MPIHelloWorld.exe可执行文件
最后,执行该程序,例如本例中采用10个核1
mpiexec -n 10 MPIHelloWorld.exe
至此,完成了Windows系统下采用命令行编译C++ MPI程序,参考此编译过程,可以将其应用到复杂的程序编译过程中,此是后话了。